package com.lgc.demo.hash;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * JAVA实现一致性哈希算法  实现一致性哈希算法中使用的哈希函数
 * 这里采用了MD5算法，主要是用来保证平衡性，即能够将机器均衡地映射到环上。貌似用Jdk中String类的hashCode并不能很好的保证平衡性。
 */
public class HashFunction {
    private MessageDigest md5 = null;

    public long hash(String key) {
        if (md5 == null) {
            try {
                md5 = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                throw new IllegalStateException("no md5 algrithm found");
            }
        }

        md5.reset();
        md5.update(key.getBytes());
        byte[] bKey = md5.digest();
        //具体的哈希函数实现细节--每个字节 & 0xFF 再移位
        long result = ((long) (bKey[3] & 0xFF) << 24)
                | ((long) (bKey[2] & 0xFF) << 16
                | ((long) (bKey[1] & 0xFF) << 8) | (long) (bKey[0] & 0xFF));
        return result & 0xffffffffL;
    }

    public static void main(String[] args){
        HashFunction hashFunction = new HashFunction();
        long aa = hashFunction.hash("144e1c57103e87ab3c4078da91f67b92");
        long bb = hashFunction.hash("144E1C57103e87ab3c4078da91f67b92");

        int a=0;
    }
}
